package main

import (
	"fmt"
	"goProject/gorm/db"
)

// 遵循默认约定的结构体
type UserDefault struct {
	ID        uint `gorm:"primaryKey"`
	Name      string
	CompanyID uint // 默认外键：CompanyDefault.ID
}

type CompanyDefault struct {
	ID    uint `gorm:"primaryKey"`
	Name  string
	Users []UserDefault // 不需要 foreignKey 配置，GORM 自动找 UserDefault.CompanyID
}

// 不遵循约定的结构体 - 外键字段名不同
type UserCustom struct {
	ID         uint `gorm:"primaryKey"`
	Name       string
	EmployerID uint // 外键字段名不是 CompanyID！
}

type CompanyCustom struct {
	ID    uint `gorm:"primaryKey"`
	Name  string
	Users []UserCustom `gorm:"foreignKey:EmployerID"` // 必须指定，因为默认会找 UserCustom.CompanyID
}

// 另一个不遵循约定的例子 - 引用字段不是主键
type UserSpecial struct {
	ID          uint `gorm:"primaryKey"`
	Name        string
	CompanyCode string // 外键指向 CompanySpecial.Code，不是 ID
}

type CompanySpecial struct {
	Code  string `gorm:"primaryKey"` // 主键是 Code，不是 ID
	Name  string
	Users []UserSpecial `gorm:"foreignKey:CompanyCode;references:Code"` // 必须指定引用字段
}

func main() {
	database := db.InitMySQL()

	// 测试默认约定
	fmt.Println("=== 测试默认约定 ===")

	// 创建公司
	company := CompanyDefault{Name: "默认约定公司"}
	database.Create(&company)
	fmt.Printf("创建公司：%s，ID：%d\n", company.Name, company.ID)

	// 创建用户
	user := UserDefault{Name: "默认约定用户", CompanyID: company.ID}
	database.Create(&user)
	fmt.Printf("创建用户：%s，公司ID：%d\n", user.Name, user.CompanyID)

	// 查询关联
	var companyWithUsers CompanyDefault
	database.Preload("Users").First(&companyWithUsers, company.ID)
	fmt.Printf("公司：%s，用户数量：%d\n", companyWithUsers.Name, len(companyWithUsers.Users))

	// 测试自定义配置 - 外键字段名不同
	fmt.Println("\n=== 测试自定义配置（外键字段名不同）===")

	// 创建公司
	customCompany := CompanyCustom{Name: "自定义配置公司"}
	database.Create(&customCompany)
	fmt.Printf("创建公司：%s，ID：%d\n", customCompany.Name, customCompany.ID)

	// 创建用户
	customUser := UserCustom{Name: "自定义配置用户", EmployerID: customCompany.ID}
	database.Create(&customUser)
	fmt.Printf("创建用户：%s，雇主ID：%d\n", customUser.Name, customUser.EmployerID)

	// 查询关联
	var customCompanyWithUsers CompanyCustom
	database.Preload("Users").First(&customCompanyWithUsers, customCompany.ID)
	fmt.Printf("公司：%s，用户数量：%d\n", customCompanyWithUsers.Name, len(customCompanyWithUsers.Users))

	// 测试自定义配置 - 引用字段不是主键
	fmt.Println("\n=== 测试自定义配置（引用字段不是主键）===")

	// 创建公司
	specialCompany := CompanySpecial{Code: "TENCENT", Name: "腾讯"}
	database.Create(&specialCompany)
	fmt.Printf("创建公司：%s，代码：%s\n", specialCompany.Name, specialCompany.Code)

	// 创建用户
	specialUser := UserSpecial{Name: "特殊用户", CompanyCode: specialCompany.Code}
	database.Create(&specialUser)
	fmt.Printf("创建用户：%s，公司代码：%s\n", specialUser.Name, specialUser.CompanyCode)

	// 查询关联
	var specialCompanyWithUsers CompanySpecial
	database.Preload("Users").First(&specialCompanyWithUsers, specialCompany.Code)
	fmt.Printf("公司：%s，用户数量：%d\n", specialCompanyWithUsers.Name, len(specialCompanyWithUsers.Users))
}
